﻿import mx.events.EventDispatcher;

/* Dimensionamiento por modificación del tamaño y la posición de los objetos.
 * Depende de cada proyecto / plantilla.
 */
class DimensionamientoInterno {
	private var objetos:MovieClip;
	private var alineacion_array:Array = new Array();
	
	public static function aplicar(_objetos:MovieClip):DimensionamientoInterno {
		var dimensionamiento_interno:DimensionamientoInterno = new DimensionamientoInterno(_objetos);
		return dimensionamiento_interno;
	}

	
	public function DimensionamientoInterno(_objetos:MovieClip) {
		EventDispatcher.initialize(this);
		objetos = _objetos;
	}

	public function agregar(alineacion:Alineacion) {
		alineacion_array.push(alineacion);
		alineacion.set_clip_sistema_referencia(objetos);
	}
	
	public function dimensionar(w_ventana:Number, h_ventana:Number):Void {
		var w_h_ventana, _0_0_ventana:Object;
		
		// (4) calcular la dimensión y posición de los objetos (incluso el de adaptación al área visible)
		w_h_ventana = {x: w_ventana, y: h_ventana};
		_0_0_ventana = {x: 0, y: 0};
		objetos.globalToLocal(w_h_ventana);
		objetos.globalToLocal(_0_0_ventana);
		// para objetos con lógica de dimensionamiento simple se modifica directamente _width y _height
		// para el resto de los objetos, se invoca el método de modificación que corresponda
		
		var i:Number;
		for(i=0; i<alineacion_array.length; i++) {
			alineacion_array[i].alinear(w_h_ventana.x-_0_0_ventana.x, w_h_ventana.y-_0_0_ventana.y);
		}

		/* Dimensionamiento y posicionamiento del objeto de adaptación al área visible.
		 * Esto se reduce a un dimensionamiento simple en función del ancho de barra_superior.
		 * Posicionamiento no hay por la hipótesis de que siempre está posicionado en (0, 0).
		 * El ancho no se calcula en función del ancho del contenido de las secciones por la hip.
		 * de que la barra superior abarca hasta el máximo x significativo.
		 *
		 * Precondición: inicialmente en escena se colocan los objetos tal que:
		 * objetos.area._width == objetos.barra_superior._width + objetos.barra_superior._x
		 * es decir, la barra superior y el objeto de adaptación al área visible están alineados a la derecha.
		 */
		objetos.area._width = w_h_ventana.x-_0_0_ventana.x;
		objetos.area._height = w_h_ventana.y-_0_0_ventana.y;
		dispatchEvent({type: "dimensionar", target: this});
	}
		
	// Inicializada por EventDispatcher
	public function addEventListener(/*...*/)/*tipo de retorno*/ {
	}
	
	/*tipo de visibilidad*/ function dispatchEvent(/*...*/)/*tipo de retorno*/ {
	}
	
	public function removeEventListener(/*...*/)/*tipo de retorno*/ {
	}
}